/*
 * @Author: Salaing
 * @Date: 2024-05-23 21:18:44
 * @LastEditors: Salaing
 */
import $http from 'api';
import { message } from 'antd';
import { history } from 'umi';

export default {
  namespace: 'user', // 命名空间 唯一
  state: {
    userInfo: sessionStorage.getItem('userProfile')
      ? JSON.parse(sessionStorage.getItem('userProfile'))
      : null,
  },
  reducers: {
    updateUserProfile: (state, { payload }) => {
      return {
        ...state,
        ...payload,
      };
    },
  },
  // 调用接口 dispatch 的type 写 namespace/对应的方法
  effects: {
    /**
     * 登录功能实现。
     * @param {Object} payload - 包含登录所需信息的对象，如用户名和密码。
     * @param {Object} context - 包含put, call, select等redux-saga提供的方法的对象。
     * @param {Function} context.put - 用于触发redux的动作。
     * @param {Function} context.call - 用于调用异步函数。
     * @param {Function} context.select - 用于选择state的一部分。
     * @returns {void} - 无返回值。
     */
    *login({ payload }, { put, call, select }) {
      // 使用call方法调用$http.userLogin函数进行用户登录验证，并解构返回的结果
      const { data, msg } = yield call($http.userLogin, payload);
      if (!data) {
        message.error(msg);
        return;
      }
      // 请求成功后获取路由表
      const routeData = yield call($http.getRoutesList);
      sessionStorage.setItem('routeList', JSON.stringify(routeData.data));
      // 将登录成功的用户信息存储到sessionStorage中
      sessionStorage.setItem('userProfile', JSON.stringify(data));
      yield put({
        type: 'updateUserProfile',
        payload: { userInfo: data },
      });
      //  跳转到首页
      history.push(routeData.data[0].route);
    },
  },
};
